package com.shuigu.ai.config;

import com.shuigu.ai.monitor.AiModelMetricsCollector;
import com.shuigu.ai.monitor.AiModelMonitorListener;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import jakarta.annotation.Resource;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

import java.util.List;

/**
 * AI并发调用问题
 * 问题分析：
 * 在实际使用过程中，我们发现了一个严重的性能瓶颈：当多个用户同时使用平台时，只有第一个用户的AI 请求能够正常处理，后续的请求都会被阻塞，需要等待前面的请求完全处理完毕后才能开始执行。
 * 用户量较少时可能不太明显，但随着平台用户的增长，这个问题会变得越发严重。想象一下，如果有10个用户同时想要生成网站，第10个用户可能需要等待几分钟以上才能看到 AI开始响应，肯定不行。
 * 问题根源：
 * 经过分析，发现问题出在 AI 大模型的 ChatModel 采用了单例模式。虽然 StreamingChatModel 返回的是 Flux响应式流，表面上看起来是异步的，
 * 但其底层的 SpringRestClient.execute（）方法内部实际上是同步解析数据流的，导致了串行执行问题。
 * 解决方案：
 * 1.工厂模式：编写一个专门的工厂类，提供创建新 ChatModel 实例的方法
 * 2.Spring多例模式：利用 Spring 的 Bean 作用域机制，从 Spring 容器中获取新的 ChatModel 实例
 *
 * 智能路由专用模型配置
 */
@Configuration
@ConfigurationProperties(prefix = "langchain4j.open-ai.chat-model")
@Data
public class RoutingAiModelConfig {

    private String baseUrl;

    private String apiKey;

    private String modelName;

    private Integer maxTokens;

    private Double temperature;

    private Boolean logRequests = false;

    private Boolean logResponses = false;

    @Resource
    private AiModelMonitorListener aiModelMonitorListener;

    /**
     * 创建用于路由判断的ChatModel
     */
    @Bean
    @Scope("prototype")
    public ChatModel routingChatModelPrototype() {
        return OpenAiChatModel.builder()
                .apiKey(apiKey)
                .modelName(modelName)
                .baseUrl(baseUrl)
                .maxTokens(maxTokens)
                .temperature(temperature)
                .logRequests(logRequests)
                .logResponses(logResponses)
                .listeners(List.of(aiModelMonitorListener))
                .build();
    }
}
